package modulo1.cci;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import modulo1.cdp.Curso;
import modulo1.cdp.Disciplina;
import modulo1.cgt.CadastroInternoApl;

@WebServlet(name = "DisciplinaCtrl", urlPatterns = {"/Disciplina"})
public class DisciplinaCtrl extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        RequestDispatcher cih = request.getRequestDispatcher("modulo1/cadint/disciplina_cadastro.jsp");
        cih.forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String evento = request.getParameter("evento");

        if (evento != null) {
            try {
                List<Curso> listaCurso = CadastroInternoApl.getInstance().cursoBuscar();
                Curso curso = null;
                request.setAttribute("lista_curso", listaCurso);
                if (request.getParameter("curso") != null) {
                    curso = CadastroInternoApl.getInstance().cursoConsultar(Long.parseLong(request.getParameter("curso")));
                    request.setAttribute("nome_curso", curso.getNome());
                }
                if (request.getParameter("periodo") != null) {
                    int periodo = Integer.parseInt(request.getParameter("periodo"));
                    List<Disciplina> listaDisciplina = CadastroInternoApl.getInstance().disciplinaBuscarPeriodoCurso(periodo, curso);
                    if (listaDisciplina == null) {
                        listaDisciplina = new ArrayList<Disciplina>();
                    }
                    request.setAttribute("lista_disciplina", listaDisciplina);
                }
            } catch (Exception ex) {
                //TODO Exceção obter cursos
                ex.printStackTrace();
            }
            if (evento.equals("alterar") || evento.equals("consultar")) {
                long id = Long.parseLong(request.getParameter("id"));
                try {
                    //TODO Problema ao atualizar as janelas de disciplinas.
                    //Os prerequisitos marcados no checkbox somem e o resultado de
                    //disciplina.getPrerequisitos() retorna zerado...
                    Disciplina disciplina = CadastroInternoApl.getInstance().disciplinaConsultar(id);
                    List<Disciplina> prerequisito = disciplina.getPrerequisitos();
                    List<Disciplina> disciplinas = CadastroInternoApl.getInstance().disciplinaBuscarPeriodoCurso(disciplina.getPeriodo(), disciplina.getCurso());
                    request.setAttribute("disciplina", disciplina);
                    request.setAttribute("prerequisito", prerequisito);
                    request.setAttribute("disciplinas", disciplinas);
                } catch (Exception ex) {
                    //TODO Exceção alterar disciplina
                }
            } else if (evento.equals("excluir")) {
                long id = Long.parseLong(request.getParameter("id"));
                try {
                    CadastroInternoApl.getInstance().disciplinaExcluir(id);

                    String redirect = "Disciplina";
                    String mensagem = "Disciplina excluida com sucesso.";
                    response.sendRedirect("resultado.jsp?redirect=" + redirect + "&mensagem=" + mensagem);
                    return;
                } catch (Exception ex) {
                    //TODO Exceção excluir curso
                    ex.printStackTrace();
                    String redirect = "Disciplina";
                    String mensagem = ex.getMessage();
                    response.sendRedirect("resultado.jsp?redirect=" + redirect + "&mensagem=" + mensagem);
                    return;
                }
            }

            RequestDispatcher cih = request.getRequestDispatcher("modulo1/cadint/disciplina_form.jsp");
            cih.forward(request, response);
            return;
        }

        String buscar = request.getParameter("buscar");
        try {
            List<Disciplina> disciplinas;
            if (buscar != null) {
                disciplinas = CadastroInternoApl.getInstance().disciplinaBuscarNome(buscar);
            } else {
                disciplinas = CadastroInternoApl.getInstance().disciplinaBuscar();
            }
            request.setAttribute("lista_disciplinas", disciplinas);
        } catch (Exception ex) {
            // TODO Exceção buscar curso
            ex.printStackTrace();
        }

        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String evento = request.getParameter("evento");
        if (evento != null) {
            if (evento.equals("inserir") || evento.equals("alterar")) {
                try {
                    Disciplina d;
                    if (request.getParameter("id") != null) {
                        d = CadastroInternoApl.getInstance().disciplinaConsultar(Long.parseLong(request.getParameter("id")));
                    } else {
                        d = new Disciplina();
                    }

                    d.setNome(request.getParameter("nome"));
                    d.setAbreviacao(request.getParameter("abreviacao"));
                    d.setCargaHoraria(Integer.parseInt(request.getParameter("carga_horaria")));
                    d.setCurso(CadastroInternoApl.getInstance().cursoConsultar(Long.parseLong(request.getParameter("curso"))));
                    d.setEmenta(request.getParameter("ementa"));
                    d.setObrigatoriedade(request.getParameter("obrigatoriedade").charAt(0));
                    d.setPeriodo(Integer.parseInt(request.getParameter("periodo")));
                    String[] cbs = request.getParameterValues("cb");

                    ArrayList<Disciplina> pre = new ArrayList<Disciplina>();
                    if (cbs != null) {
                        for (int i = 0; i < cbs.length; i++) {
                            pre.add(CadastroInternoApl.getInstance().disciplinaConsultar(Long.parseLong(cbs[i])));
                        }
                    }
                    d.setPrerequisitos(pre);

                    CadastroInternoApl.getInstance().disciplinaSalvar(d);

                    String redirect = "Disciplina";
                    String mensagem = "Disciplina salvo com sucesso.";
                    response.sendRedirect("resultado.jsp?redirect=" + redirect + "&mensagem=" + mensagem);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    String redirect = "Disciplina";
                    //String mensagem = ex.getMessage();
                    String mensagem = "Erro ao salvar disciplina.";
                    response.sendRedirect("resultado.jsp?redirect=" + redirect + "&mensagem=" + mensagem);
                }
                return;
            }
        }

        processRequest(request, response);
    }
}
